/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package py.com.spadons.esmetil.controllers.jsf;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.DragDropEvent;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import py.com.spadons.esmetil.entities.Dato;
import py.com.spadons.esmetil.entities.Estacion;
import py.com.spadons.esmetil.entities.EstacionDetalle;
import py.com.spadons.esmetil.entities.Usuario;

/**
 *
 * @author spadons
 */

@ManagedBean
@SessionScoped
public class IndexController implements Serializable{
    
    @EJB
    private py.com.spadons.esmetil.sessionBeans.EstacionFacade estacionFacade;
    @EJB
    private py.com.spadons.esmetil.sessionBeans.UsuarioFacade usuarioFacade;
    @EJB
    private py.com.spadons.esmetil.sessionBeans.EstacionDetalleFacade estacionDetalleFacade;
    @EJB
    private py.com.spadons.esmetil.sessionBeans.DatoFacade datoFacade;
    
    private Estacion estacionSeleccionda;
    private Usuario usuario;
    private List<EstacionDetalle> detalleDisponible;
    private List<EstacionDetalle> detalleSeleccionado;

    public IndexController() {
    }
    
    @PostConstruct
    public void inicializar(){          
        
    }
    
    public void cargarEstacion(Integer estacionId) throws IOException{
              
        //Determiar la estación seleccionada
        estacionSeleccionda = estacionFacade.find(estacionId);
        
        //Cargar los Detalle Estacion de un usuario pero solo si se trata de la estación seleccionada
        detalleSeleccionado = new ArrayList<EstacionDetalle>();
        for (EstacionDetalle eD : getUsuario().getEstacionDetalleList()) {
            if (eD.getEstacion().equals(estacionSeleccionda)){
                detalleSeleccionado.add(eD);
            }
         }
        
        //Cargar los Detalle de Estacion disponibles en la estacion, y quitar lo que ya está siendo visualizado                
        detalleDisponible = estacionDetalleFacade.findByEstacion(estacionSeleccionda);
        detalleDisponible.removeAll(detalleSeleccionado);
        
        //Ir a la pagina de estaciones
        FacesContext.getCurrentInstance().getExternalContext().redirect("/Esmetil/App/WebApp/index.xhtml");
    }

    public Estacion getEstacionSeleccionda() {
        return estacionSeleccionda;
    }

    public void setEstacionSeleccionda(Estacion estacionSeleccionda) {
        this.estacionSeleccionda = estacionSeleccionda;
    }

    public List<EstacionDetalle> getDetalleDisponible() {
        return detalleDisponible;
    }

    public void setDetalleDisponible(List<EstacionDetalle> detalleDisponible) {
        this.detalleDisponible = detalleDisponible;
    }

    public List<EstacionDetalle> getDetalleSeleccionado() {
        return detalleSeleccionado;
    }

    public void setDetalleSeleccionado(List<EstacionDetalle> detalleSeleccionado) {
        this.detalleSeleccionado = detalleSeleccionado;
    }

    public Usuario getUsuario() {
        
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        String name = auth.getName(); //get logged in username
      
        usuario = usuarioFacade.find(name);  
        
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
       
    public void onMagnitudDrop(DragDropEvent ddEvent) {  
        EstacionDetalle detalle = ((EstacionDetalle) ddEvent.getData());  
        //Actualizar el controlador
        detalleSeleccionado.add(detalle);  
        detalleDisponible.remove(detalle);
        //Actualizar la Entidad
        detalle.getUsuarioList().add(usuario);
        estacionDetalleFacade.edit(detalle);
    }
    
    public void quitarMagnitud(EstacionDetalle detalle){ 
         //Actualizar el controlador
         detalleSeleccionado.remove(detalle);
         detalleDisponible.add(detalle);
         //Actualizar la Entidad
         detalle.getUsuarioList().remove(usuario);
         estacionDetalleFacade.edit(detalle);
    }
    
    public Date fechaUltMuestra(EstacionDetalle detalle){
        
        Dato d = datoFacade.findUltimoByEstacionDetalle(detalle);
        
        Date date = new Date(1);
        
        if (d!=null){
            date = d.getMomento();
        }
        return date;
    }
    
    public Double ultValor(EstacionDetalle detalle){
        
        Dato d = datoFacade.findUltimoByEstacionDetalle(detalle);

        Double valor = new Double(0);
        
        if (d!=null){
            valor = d.getValor();
        }
        return valor;
    }
    
    
        
}